from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView, ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.viewsets import ViewSet, GenericViewSet

from .models import BookInfo
from .serializer import BookSerializer


class BooksView(GenericViewSet):
    """获取所有图书、保存图书"""
    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    def list(self, req):
        """获取所有图书"""
        # 查询所有的图书信息
        books = self.get_queryset()  # 获取查询集

        ser = self.get_serializer(books, many=True)

        return Response(ser.data)  # data 是Serializer里提供的方法

    def create(self, req):
        """保存图书"""
        # 获取前端数据
        data = req.data
        # 2、校验数据
        ser = self.get_serializer(data=data)
        ser.is_valid()

        # 保存数据
        ser.save()

        # 4、返回结果
        return Response(ser.data)


class BookView(GenericViewSet):
    """获取单一图书、更新图书、删除图书"""

    queryset = BookInfo.objects.all()  # 指定当前类视图使用的查询集数据
    serializer_class = BookSerializer  # 指定当前类视图使用的序列化器

    def update(self, req, pk):
        """更新图书"""
        # 接收数据
        data = req.data
        # 校验数据
        try:
            book = self.get_object()  # 这个到底应该是什么？就是应该这样写：获取对象
        except:
            return JsonResponse({'error': '信息错误'}, status=400)
        ser = self.get_serializer(book, data=data)
        ser.is_valid()  # 验证要记得

        # 3、更新数据
        ser.save()

        # 4、返回结果
        return Response(ser.data)

    def lastdata(self, request, pk):
        """自定义方法名"""
        book = self.get_queryset()

        ser = self.get_serializer(book)

        return Response(ser.data)

